//ESP8266作为服务器端，手机作为客户端
#include <ESP8266WiFi.h>

char* WIFI_SSID = "xxxxxxx";                //WIFI名称
char* WIFI_PASSWORD = "xxxxxxx";            //WIFI密码

int SERVICE_PORT = 8888;                    //创建的TCP服务器的端口号
                                            //在接入WIFI后自动获取TCP服务器的IP地址
#define MAX_TCPSERVICE_CLIENTS_NUM  2       //可连接的客户端数量最大值，标号从0开始
WiFiServer server(SERVICE_PORT);            //绑定服务器端口号
WiFiClient serverClients[MAX_TCPSERVICE_CLIENTS_NUM];   //记录最大数量的客户端

String rec_str = "";                        //定义接收的数据
#define LEDPin   10                         //外接LED引脚

void setup() {
  pinMode(LEDPin, OUTPUT);                  //初始化LED引脚
  digitalWrite(LEDPin, HIGH);               //初始化关闭LED（低电平触发）
  Serial.begin(115200);                     //串口初始化
  Serial.println("");
  WIFI_Init(WIFI_SSID,WIFI_PASSWORD);       //连接wifi，连接成功后执行后续程序，否则阻塞
  server.begin();                           //启动服务器   
  server.setNoDelay(true);                  //禁用Nagle算法，即消息直接发送，不合并小消息
  Serial.println("等待客户端接入......");
}
void loop() {
  uint8_t i;
  if (server.hasClient()) //如果有客户端接入
  {
    Serial.println("客户端接入");
    for(i = 0; i < MAX_TCPSERVICE_CLIENTS_NUM; i++)//遍历连接的客户端
    {
      if ((!serverClients[i])|| (!serverClients[i].connected()))//启用连接的客户端
      {
        if(serverClients[i]) 
          serverClients[i].stop();
        serverClients[i] = server.available();
        //客户端接入后发送客户端一个“Connected!”，客户端接收到可用于验证是否接入成功
        serverClients[i].print("Connected!"); 
        continue;
      }
    }
    WiFiClient serverClient = server.available();   //如果未检查到客户端，则停止连接
    serverClient.stop();
  }

  for(i = 0; i < MAX_TCPSERVICE_CLIENTS_NUM; i++)   //处理客户端发送的数据
  {
    if (serverClients[i] && serverClients[i].connected())
    {
      if(serverClients[i].available()){
        while(serverClients[i].available())       //通道有数据，逐一读取并合并成字符串
        {
          rec_str += char(serverClients[i].read()); 
        }
        Serial.print("接收到客户端的数据：");         
        Serial.print(rec_str);                    //串口发送接收的数据
        Serial.println("");                       //换行
        serverClients[i].print(rec_str);          //向客户端回传接收的数据，以检验通信完整性 

        //客户端断开时会发送一个”Disconnect!“，设备可由此及时判断掉线
        if(rec_str=="Disconnect!")                
          Serial.println("客户端断开");
        else
          Data_Handle(rec_str);                   //数据处理
        rec_str="";                               //清空接收数据缓存
      }
    }
  }
}
void WIFI_Init(char* wifi_ssid,char* wifi_password)
{
  uint8_t times = 0;      //用于记录单次连接WiFi的超时时间
  WiFi.begin(wifi_ssid, wifi_password);//开始连接wifi
  Serial.println("");
  Serial.print("正在连接wifi:"); 
  Serial.print(wifi_ssid);
  while (WiFi.status()!= WL_CONNECTED && times++ < 51)//检查连接情况，等待WiFi连接成功，超时跳出
  {
    delay(200);
    Serial.print(".");
  }
  if(times == 51)//10s内未连接成功
  { 
    Serial.print("WIFI："); 
    Serial.print(wifi_ssid);
    Serial.println(" 连接失败，请检查WiFi是否开启，或WIFI名称和密码是或否匹配，或按复位键重新尝试连接。");
    times=0;
    while(1) delay(500);  //阻塞
  }
  Serial.println("");
  Serial.print("连接成功，IP地址：");
  Serial.println(WiFi.localIP());//获取IP
}
void Data_Handle(String strdata)
{
  Serial.println("开始数据处理");
  if(strdata=="LEDON")
  {
    Serial.println("灯光：打开");
    digitalWrite(LEDPin, LOW);
  }
  else if(strdata=="LEDOFF")
  {
    Serial.println("灯光：关闭");
    digitalWrite(LEDPin, HIGH);
  }
  Serial.println("数据处理完成");
}
